package com.dhcc.sds.util;

import com.alibaba.fastjson.JSONArray;
import com.alibaba.fastjson.JSONObject;
import com.dhcc.core.framework.util.CommonUtil;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;

import java.io.BufferedReader;
import java.io.InputStream;
import java.io.InputStreamReader;
import java.io.PrintWriter;
import java.net.HttpURLConnection;
import java.net.URL;
import java.net.URLEncoder;

/**
 * @description :调用东华语义分析接口
 * @author :sunyingjie
 * @date :2022年11月28日
 * @version :1.0
 */
public class DHCAI {
	protected final static Logger logger = LoggerFactory.getLogger(DHCAI.class);

	/**
	 * @description :调用东华语义分析接口
	 * @param path 接口地址  
	 * @param data 文本内容
	 * @param title  检查exam 电子病历为emr
	 * @author :sunyingjie
	 * @date :2022年11月28日
	 * @version :1.0
	 * */
	public static JSONArray parse(String path, String data,String title,String subTitle) {
		JSONArray resultObj = new JSONArray();
		
		try {
			data = "data=" + URLEncoder.encode(data, "UTF-8") ;
			URL url = new URL(path);
			// 打开和url之间的连接
			HttpURLConnection conn = (HttpURLConnection) url.openConnection();
			//System.err.println("getResponseCode:"+conn.getResponseCode());
			PrintWriter out = null;
			// 请求方式
			conn.setRequestMethod("POST");
			//设置通用的请求属性
			conn.setRequestProperty("accept", "*/*");
			conn.setRequestProperty("connection", "Keep-Alive");
			conn.setRequestProperty("user-agent", "Mozilla/4.0 (compatible; MSIE 6.0; Windows NT 5.1; SV1)");
			// 设置是否向httpUrlConnection输出，设置是否从httpUrlConnection读入，此外发送post请求必须设置这两个
			// 最常用的Http请求无非是get和post，get请求可以获取静态页面，也可以把参数放在URL字串后面，传递给servlet，
			// post与get的 不同之处在于post的参数不是放在URL字串里面，而是放在http请求的正文内。
			conn.setDoOutput(true);
			conn.setDoInput(true);
			//conn.setConnectTimeout(5000);
			//conn.connect();
			
			// 获取URLConnection对象对应的输出流
			out = new PrintWriter(conn.getOutputStream());
			// 发送请求参数即数据
			out.print(data);
			// 缓冲数据
			out.flush();
			// 获取URLConnection对象对应的输入流
			InputStream is = conn.getInputStream();
			// 构造一个字符流缓存
			BufferedReader br = new BufferedReader(new InputStreamReader(is,"UTF-8"));
			StringBuffer sb = new StringBuffer("");
			String str = "";
			while ((str = br.readLine()) != null) {
				sb.append(str);
			}
			//System.out.println("sb:"+sb);
			//System.err.println("getResponseCode:"+conn.getResponseCode());
			// 关闭流
			is.close();
			br.close();
			out.close();
			// 断开连接，最好写上，disconnect是在底层tcp socket链接空闲时才切断。如果正在被其他线程使用就不切断。
			// 固定多线程的话，如果不disconnect，链接会增多，直到收发不出信息。写上disconnect后正常一些。
			conn.disconnect();
//			resultObj = parseSection(sb,title,subTitle);
			resultObj = JSONArray.parseArray(sb.toString());
		} catch (Exception e) {
			e.printStackTrace();
		}

		return resultObj;
	}

	
	/**
	 * @Description：对结果进行拆解加工
	 * @Author sunyingjie
	 * @param sb
	 * @Date:2022年11月28日下午1:56:00
	 */
	private static JSONObject parseSection(StringBuffer sb,String title,String subTitle) {
		JSONObject resultObj = new JSONObject();
		JSONArray array = new JSONArray();
		try {
			array = JSONArray.parseArray(sb.toString());
		} catch (Exception e) {
			logger.error(e.getMessage());
		}
		
		if(CommonUtil.isNotEmpty(array)){
			if(title.equals("exam")){//检查
				JSONArray checkInfo = new JSONArray();
				for(int i=0;i<array.size();i++){
					JSONObject obj = array.getJSONObject(i);
					String objType = obj.getString("type");//疾病或症状类型	+symptom：阳性症状 -symptom：阴性症状 ?symptom：无法辨别阴阳性症状
															//+disease：阳性疾病//-disease：阴性疾病  //?disease：无法辨别阴阳性疾病
					//阳性疾病和疑似疾病 阳性症状疑似症状
					if(objType.equals("+disease")||objType.equals("?disease")||objType.equals("+symptom")||objType.equals("?symptom")){
						checkInfo.remove(obj.get("name"));//去掉重复的
						checkInfo.add(obj.get("name"));
					}
				}
				resultObj.put("checkInfo", checkInfo);
			}else{//电子病历  pastHisDis既往史，pastHisOper既往史手术，BMI肥胖指数，BMP脉搏心率，BMR呼吸，BPH收缩压，BPL舒张压，
				//diagAdmDis入院诊断，diagDiscDis出院诊断,医嘱orderInfo，presHisOper现病史手术，presHisDis现病史，examGenSym症状
				//*******建议把东华电子病历中诊断信息都放入MRDIAGNOS诊断表，因为解析出来的type不固定有的为主诉、有的体格检查，没有入院诊断出院诊断分类***//

				JSONArray presHisDis = new JSONArray();//现病史
				JSONArray examGenSym = new JSONArray();//症状
				JSONArray pastHisDis = new JSONArray();//既往史
				JSONArray genHisDis = new JSONArray();//家族史
				JSONArray mrHis = new JSONArray();//婚育史
				JSONArray diagAdmDis = new JSONArray();//入院诊断
				JSONArray diagDiscDis = new JSONArray();//出院诊断
				JSONArray pastHisOper = new JSONArray();//既往史手术
				JSONArray presHisOper = new JSONArray();//现病史手术
				JSONArray personalHis = new JSONArray();//个人史
				String pregnantTimes = "0";//女性 怀孕几次 pregnant_times(和section_type同级) -value
				String birthTimes = "0";//女性 产胎几次 birth_times(和section_type同级) -value 
				
				for(int i=0;i<array.size();i++){
					JSONObject obj = array.getJSONObject(i);
					//疾病或症状类型	+symptom：阳性症状， -symptom：阴性症状， ?symptom：无法辨别阴阳性症状，
					//+disease：阳性疾病，-disease：阴性疾病，?disease：无法辨别阴阳性疾病
					//sign:体格检查 T：36.5℃ P：87次/分 R：19次/分 BP：121/87mmHg H：174cm W：65kg
					//+operation：手术， +Drug：药物， -personalhistory个人史阴性，+personalhistory个人史阳性
					//-pasthistory、+pasthistory既往史
					String objType = obj.getString("type");
					//既往史、现病史、主诉、体格检查、个人史
					String disease = "";//疾病
					String symptom = "";//症状
					String operation = "";//手术
					String personalhistory = "";
					//阳性疾病和疑似疾病
					if(objType.equals("+disease")){
						disease = (String) obj.get("name");
					}
					//阳性症状和疑似症状
					if(objType.equals("+symptom")){
						symptom = (String) obj.get("name");
					}
					//手术
					if(objType.equals("+operation")){
						operation = (String) obj.get("name");
					}
					//个人史
					if(objType.equals("+personalhistory")){
						personalhistory = obj.getString("name");
					}
					
					//家族史
					if(objType.equals("+familyhistory")){
						disease = (String) obj.get("name");
					}
					
					//孕几
					if(CommonUtil.isNotEmpty(obj.get("pregnant_times"))){
						pregnantTimes = obj.getJSONObject("pregnant_times").getString("value");
					}
					//产几
					if(CommonUtil.isNotEmpty(obj.get("birth_times"))){
						birthTimes = obj.getJSONObject("birth_times").getString("value");
					}

					//如果有子标题按照子标题分类 如果没有按照解析出来的section_type分类
					String sectionType = CommonUtil.isNotEmpty(subTitle) ? subTitle : obj.getString("section_type");
					//疾病
					if(CommonUtil.isNotEmpty(disease)){
						switch (sectionType) {
							case "既往史":
								pastHisDis.remove(disease);
								pastHisDis.add(disease);
								break;
							case "现病史":
							case "个人史":
								presHisDis.remove(disease);
								presHisDis.add(disease);
								break;
							case "家族史":
								genHisDis.remove(disease);
								genHisDis.add(disease);
								break;
							case "婚育史":
								mrHis.remove(disease);
								mrHis.add(disease);
								break;
							case "入院诊断":
							case "初步诊断":
								diagAdmDis.remove(disease);
								diagAdmDis.add(disease);
								break;
							case "出院诊断":
							case "死亡诊断":
								diagDiscDis.remove(disease);
								diagDiscDis.add(disease);
							default://其他类型的都放到现病史中 如主诉、病例特点、住院病程等
								presHisDis.remove(disease);
								presHisDis.add(disease);
								break;
						}
					}
					//手术
					if(CommonUtil.isNotEmpty(operation)){
						switch (sectionType) {
							case "既往史":
								pastHisOper.remove(operation);
								pastHisOper.add(operation);
								break;
							case "现病史":
								presHisOper.remove(operation);
								presHisOper.add(operation);
								break;
							default://其他忽略
								break;
						}
					}
					//症状
					if(CommonUtil.isNotEmpty(symptom)){
						examGenSym.remove(symptom);
						examGenSym.add(symptom);
					}
					//个人史
					if(CommonUtil.isNotEmpty(personalhistory)){
						personalHis.remove(personalhistory);
						personalHis.add(personalhistory);
					}
				}
				if(CommonUtil.isNotEmpty(presHisDis)){//现病史
					resultObj.put("presHisDis", presHisDis);
				}
				if(CommonUtil.isNotEmpty(examGenSym)){//症状
					resultObj.put("examGenSym", examGenSym);
				}
				if(CommonUtil.isNotEmpty(pastHisDis)){//既往史
					resultObj.put("pastHisDis", pastHisDis);
				}
				if(CommonUtil.isNotEmpty(genHisDis)){//家族史
					resultObj.put("genHisDis", genHisDis);
				}
				if(CommonUtil.isNotEmpty(mrHis)){//婚育史
					resultObj.put("mrHis", mrHis);
				}
				if(CommonUtil.isNotEmpty(diagAdmDis)){//入院诊断
					resultObj.put("diagAdmDis", diagAdmDis);
				}
				if(CommonUtil.isNotEmpty(diagDiscDis)){//出院诊断
					resultObj.put("diagDiscDis", diagDiscDis);
				}
				if(CommonUtil.isNotEmpty(pastHisOper)){//既往史手术
					resultObj.put("pastHisOper", pastHisOper);
				}
				if(CommonUtil.isNotEmpty(presHisOper)){//现病史手术
					resultObj.put("presHisOper", presHisOper);
				}
				if(CommonUtil.isNotEmpty(personalHis)){//个人史
					resultObj.put("personalHis", personalHis);
				}
				resultObj.put("pregnantTimes", pregnantTimes);//孕几
				resultObj.put("birthTimes", birthTimes);//产几
			}
		}
		return resultObj;
	}
}
